"""
什么是浅拷贝，什么是深拷贝？
    浅拷贝：只针对第一层开辟新内存存储，其它层依次引用；
    深拷贝：所有层一次开辟新内存存储
"""
import copy

"""
浅拷贝：只针对第一层开辟新内存存储，其它层依次引用；
    1、拷贝的元素与原对象元素一致
    2、由于第一层的元素是不可变数据类型，如果对list1的第一层的1,2,3元素进行修改，则list2的不会改变；相同，如果对list2的不可变元素进行修改，list1的也不会改变。
    3、如果对list1或者是list2中的嵌套列表的元素进行修改，则他们也会随之修改，因为他们用的是共同的嵌套内容
"""
# 一个列表内嵌套多个列表
list1 = [1, 2, 3, [4, 5, 6, [7, 8, 9]]]
list2 = list1.copy()
# 查看内容，两个列表的内容是相同的。列表的id是不同的,但是列表内的元素的id还是相同的
print(list1)
print(list2)
print(id(list1))
print(id(list2))

# 修改list1、list2的第一层对象的元素，他们双方都不因对方的改变而改变自身的元素
list1[0] = "壹"
list2[1] = "贰"
print(list1)
print(list2)
print(id(list1[0]))
print(id(list2[0]))

# 修改嵌套的子对象的元素，因为其他层次的内容是共同的，所以修改了其中一个列表的元素，则另外一个列表的元素也会随之修改
list1[3][3][0] = "柒"
list2[3][3][2] = "玖"
print(list1)
print(list2)
print(id(list1[3][3][0]))
print(id(list2[3][3][0]))


"""
深拷贝：所有层一次开辟新内存存储
    深拷贝需要导包--import copy，然后使用 copy.deepcopy()方法
    1、 如上(浅拷贝)，拷贝的元素与原对象元素一致；
    2、 如果对原对象或者是深拷贝出来的对象的元素进行修改，他们都互不影响，因为深拷贝出来的对象是独立的对象。
"""
l1 = [1, 2, 3, [4, 5, 6, [7, 8, 9]]]
l2 = copy.deepcopy(l1)
# 查看内容，两个列表的内容是相同的。列表的id是不同的,但是列表内的元素的id还是相同的
print(l1)
print(l2)
print(id(l1))
print(id(l2))
print(id(l1[0]))
print(id(l2[0]))

# 修改list1、list2的第一层对象的元素，他们双方都不因对方的改变而改变自身的元素
l1[0] = "壹"
l2[1] = "贰"
print(l1)
print(l2)
print(id(l1[0]))
print(id(l2[0]))

# 修改嵌套的子对象的元素，由于深拷贝出来的是独立的对象，所以他们的改变是互不影响的。
l1[3][3][0] = "柒"
l2[3][3][2] = "玖"
print(l1)
print(l2)
print(id(l1[3][3][0]))
print(id(l2[3][3][0]))
